<?php

class Interpreter {
    private $setter;
    private $componentsList;
        
    public function __construct() {
        $this->setter=new Setter($configurationsPath="../Config");
        $this->componentsList=array(); 
    }
    public function getComponentsList(){
        //Leer archivo de ComponentsList
        return $this->setter->getAvailableComponents();
    }
    /**
     *
     * @param type $componentInfo es un String de la forma "nombreComponente=direccionProcesos"
     */
    public function getComponentDescription($componentInfo="Calculator=http://127.0.0.1/engineerplus/Calculator/Events/EventsCalculator.php"){
        $aux=explode("=", $componentInfo);
        $client = new SoapClient(null,array('location' =>$aux[1],'uri' => 'urn:webservices'.$aux[0]));
        //Llamar el metodo como si fuera del cliente
        $componentDescription=$client->getDescription();
        return $componentDescription;
    }
    public function getComponentFunctions($componentInfo="Calculator=http://127.0.0.1/engineerplus/Calculator/Events/EventsCalculator.php"){
        $aux=explode("=", $componentInfo);
        $client = new SoapClient(null,array('location' =>$aux[1],'uri' => 'urn:webservices'.$aux[0]));
        //Llamar el metodo como si fuera del cliente
        $componentFunctions=$client->getFunctionsList();
        return $componentFunctions;
    }
    public function executeFunction($componentInfo="Calculator=http://127.0.0.1/engineerplus/Calculator/Events/EventsCalculator.php",$scriptName="script.sci", $function="name(param1,param2)"){
        $aux=explode("=", $componentInfo);
        $client = new SoapClient(null,array('location' =>$aux[1],'uri' => 'urn:webservices'.$aux[0]));
        //Llamar el metodo como si fuera del cliente
        $ansFunction=$client->exe($scriptSCEName=$scriptName,$fun=$function);
        return $ansFunction;
    }
    
    //Metodos para registro de componentes nuevos
    //$componentInfo es un String de la forma "nombreComponente=direccionProcesos"
    public function registerComponent($componentInfo="nameComponent=http://dirServer/fileWebServices.php"){
        //Leer ComponentsList
        $componentsList=file("../Config/ComponentsList.php");
        
        //Añadimos a $componentList el nuevo registro
        $componentsList[]=$componentInfo;
        
        //Borramos el archivo con info antigua
        if(file_exists("../Config/ComponentsList.php")){
            unlink("../Config/ComponentsList.php");
        }
        
        //Creamos el nuevo archivo con los datos nuevos
        $gestor=fopen("../Config/ComponentsList.php",'x+');
        $content="";
	foreach ($componentsList as $line){
            $content.=trim($line,"\x00..\x1F").chr(13).chr(10);
        }
	
	fwrite($gestor,$content);
	fclose($gestor);
        
        return "ok";
        
    }
    public function unregisterComponent($componentInfo="nameComponent=http://dirServer/fileWebServices.php"){
        //Leer ComponentsList
        $componentsList=file("../Config/ComponentsList.php");
        
        $componentsListFinal=array();
        foreach ($componentsList as $component){
            $componentsListFinal[]=trim($component,"\x00..\x1F");
        }
        //Quitamos a $componentList el registro
        $item=array_search($componentInfo, $componentsListFinal);
        unset($componentsListFinal[$item]);
        
        //Borramos el archivo con info antigua
        if(file_exists("../Config/ComponentsList.php")){
            unlink("../Config/ComponentsList.php");
        }
        
        //Creamos el nuevo archivo con los datos nuevos
        $gestor=fopen("../Config/ComponentsList.php",'x+');
        $content="";
	foreach ($componentsListFinal as $line){
            $content.=trim($line,"\x00..\x1F").chr(13).chr(10);
        }
	
	fwrite($gestor,$content);
	fclose($gestor);
        
        return ">>".$item;
        
    }
    
}

?>
